package com.example.design.singleton;

/**
 * @ClassName Singleton6
 * @Description DCL单例模式+Volatile【可用】
 * 为了解决[同步代码块]存在的线程不安全问题，我们引入双重锁，即Double-Check-Locking。
 * 同时引入volatile关键字修饰实例对象，这是为了避免因JVM指令重排序可能导致的空指针异常。
 * 因为当线程执行到第一个if (null == instance)时，代码可能读取到instance不为null，但此时instance引用的对象可能还没有完成初始化。
 * 线程安全性： 线程安全性
 * 是否懒加载： 懒加载
 * 性能： 性能比较好
 * @Author Administrator
 * @Date 2020/5/7 10:48
 * @Version 1.0
 */
public class Singleton6 {

    private static volatile Singleton6 instance;

    private Singleton6(){}

    public static Singleton6 getInstance(){

        // 被动创建，在真正需要使用时才去创建
        if(instance == null){
            synchronized (Singleton6.class) {
                if(instance == null) {
                    instance = new Singleton6();
                }
            }
        }
        return instance;
    }

    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Singleton6 s1 = Singleton6.getInstance();
        Singleton6 s2 = Singleton6.getInstance();
        s1.setName("zhangsan6");
        s2.setName("lisi6");
        System.out.println(s1.getName());
        System.out.println(s2.getName());
        System.out.println(s1.getName().equals(s2.getName()));
    }

}
